{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import torch\n",
    "from data_provider.data_factory import Data_Provider\n",
    "import yaml, json\n",
    "from utils.tools import dotdict"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# load json\n",
    "with open('checkpoints/03-11-0936_FITS_solar_day_ahead/args.json', 'r') as f:\n",
    "    args = json.load(f)\n",
    "args = dotdict(args)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# load yaml\n",
    "with open('./data_configs/fullsolar_hetero.yaml') as f:\n",
    "    data_config = yaml.load(f, Loader=yaml.FullLoader)\n",
    "data_config = dotdict(data_config)\n",
    "args.data_config = data_config\n",
    "\n",
    "args.scale = False # disable the normalization"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ info ] Successfully load the dynamic data from fast_general_weather_forecast_????.json\n"
     ]
    }
   ],
   "source": [
    "a=Data_Provider(args, buffer=(not args.disable_buffer))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Loading val datasets:  11%|█         | 1/9 [00:00<00:05,  1.56it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Add data /data/Blob_WestJP/v-zhijianxu/Benchmark/fullsolar/impute_data/id_314106.parquet to buffer\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Loading val datasets:  22%|██▏       | 2/9 [00:01<00:03,  1.83it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Add data /data/Blob_WestJP/v-zhijianxu/Benchmark/fullsolar/impute_data/id_319086.parquet to buffer\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Loading val datasets:  33%|███▎      | 3/9 [00:01<00:03,  1.81it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Add data /data/Blob_WestJP/v-zhijianxu/Benchmark/fullsolar/impute_data/id_164440.parquet to buffer\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Loading val datasets:  44%|████▍     | 4/9 [00:02<00:02,  1.76it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Add data /data/Blob_WestJP/v-zhijianxu/Benchmark/fullsolar/impute_data/id_355827.parquet to buffer\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Loading val datasets:  56%|█████▌    | 5/9 [00:02<00:02,  1.73it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Add data /data/Blob_WestJP/v-zhijianxu/Benchmark/fullsolar/impute_data/id_331901.parquet to buffer\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Loading val datasets:  67%|██████▋   | 6/9 [00:03<00:01,  1.81it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Add data /data/Blob_WestJP/v-zhijianxu/Benchmark/fullsolar/impute_data/id_332785.parquet to buffer\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Loading val datasets:  78%|███████▊  | 7/9 [00:03<00:01,  1.78it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Add data /data/Blob_WestJP/v-zhijianxu/Benchmark/fullsolar/impute_data/id_577650.parquet to buffer\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Loading val datasets:  89%|████████▉ | 8/9 [00:04<00:00,  1.87it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Add data /data/Blob_WestJP/v-zhijianxu/Benchmark/fullsolar/impute_data/id_551172.parquet to buffer\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Loading val datasets: 100%|██████████| 9/9 [00:04<00:00,  1.83it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Add data /data/Blob_WestJP/v-zhijianxu/Benchmark/fullsolar/impute_data/id_570079.parquet to buffer\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "fullsets = a.get_val('set')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dict_keys(['314106', '319086', '164440', '355827', '331901', '332785', '577650', '551172', '570079'])"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fullsets.keys()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "8569"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "seta = fullsets['314106']\n",
    "len(seta)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "instance = seta[2000-144]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'[{\"daily\":\"It\\'s going to be a beautiful day in March, with a mix of sunshine and passing clouds. Temperatures will be mild, ranging from 4 to 14 degrees Celsius. Expect a gentle breeze blowing from the south to the north, with wind speeds of around 20-30 km\\\\/h. As the day progresses, the humidity will decrease, making it a pleasant day to be outdoors. However, be prepared for scattered showers in the late evening, with a chance of partly cloudy skies.\",\"Early Morning\":\"Early morning will be cool and calm, with temperatures ranging from 4 to 7 degrees Celsius. Expect passing clouds and a gentle breeze blowing from the south to the north, with wind speeds of around 10-20 km\\\\/h. It\\'s a great time to get outside and enjoy the fresh air!\",\"Morning\":\"Morning will be partly cloudy, with temperatures ranging from 7 to 12 degrees Celsius. Expect a gentle breeze blowing from the south to the north, with wind speeds of around 20-30 km\\\\/h. It\\'s a great time to get outside and enjoy the sunshine!\",\"Afternoon\":\"Afternoon will be sunny, with temperatures ranging from 12 to 14 degrees Celsius. Expect a gentle breeze blowing from the south to the north, with wind speeds of around 20-30 km\\\\/h. It\\'s a great time to get outside and enjoy the sunshine!\",\"Evening\":\"Evening will be partly cloudy, with temperatures ranging from 11 to 9 degrees Celsius. Expect scattered showers and a gentle breeze blowing from the west to the east, with wind speeds of around 20-30 km\\\\/h. It\\'s a great time to get outside and enjoy the fresh air, but be prepared for some rain!\",\"time\":\"20210319000000\",\"note\":\"\"},{\"daily\":\"It\\'s going to be a chilly day with a mix of passing clouds and partly cloudy skies. Expect a temperature drop in the late afternoon, with a high of around 10 degrees Celsius and a low of around 1 degree Celsius. There might be a sudden shower in the late afternoon, so make sure to carry an umbrella.\",\"Early Morning\":\"Early morning will be quite chilly with a temperature of around 3 degrees Celsius. Expect passing clouds with a gentle breeze of around 11 km\\\\/h. It\\'s a good idea to dress warmly for the morning.\",\"Morning\":\"Morning will see a slight temperature rise to around 4 degrees Celsius. The weather will remain mostly cloudy with a gentle breeze of around 9 km\\\\/h. It\\'s a good day to get some fresh air.\",\"Afternoon\":\"Afternoon will be quite windy with a temperature of around 10 degrees Celsius. Expect passing clouds with a strong breeze of around 32 km\\\\/h. There might be a sudden shower in the late afternoon, so make sure to carry an umbrella.\",\"Evening\":\"Evening will see a temperature drop to around 8 degrees Celsius. The weather will remain mostly cloudy with a gentle breeze of around 24 km\\\\/h. It\\'s a good idea to dress warmly for the evening.\",\"time\":\"20210320000000\",\"note\":\"\"},{\"daily\":\"It\\'s going to be a chilly day with a mix of clouds and sunshine. Expect a temperature drop in the late afternoon, with a high of around 8 degrees Celsius and a low of around 2 degrees Celsius. There might be some scattered showers in the evening, so it\\'s a good idea to bring an umbrella.\",\"Early Morning\":\"Early morning will be partly cloudy with a temperature around 0 degrees Celsius. Expect a gentle breeze from the north.\",\"Morning\":\"Morning will be mostly cloudy with a temperature around 2 degrees Celsius. There might be some scattered showers, so it\\'s a good idea to bring an umbrella.\",\"Afternoon\":\"Afternoon will be mostly cloudy with a temperature around 7 degrees Celsius. Expect a gentle breeze from the south.\",\"Evening\":\"Evening will be partly cloudy with a temperature around 2 degrees Celsius. There might be some scattered showers, so it\\'s a good idea to bring an umbrella.\",\"time\":\"20210321000000\",\"note\":\"\"},{\"daily\":\"It\\'s going to be a chilly day tomorrow, March 22nd, in the early spring. Expect mostly cloudy skies with a high chance of scattered showers and light snow in the late afternoon and evening. Temperatures will be quite low, ranging from around 2 to 7 degrees Celsius throughout the day. Be prepared for strong winds and icy conditions, especially in the evening.\",\"Early Morning\":\"Early morning, March 22nd, will be quite chilly with partly cloudy skies and a gentle breeze. Temperatures will be around 2-4 degrees Celsius. Expect a partly sunny day with a high chance of scattered showers and light snow in the late afternoon and evening.\",\"Morning\":\"Morning, March 22nd, will be mostly cloudy with a high chance of scattered showers and light snow. Temperatures will be around 4-6 degrees Celsius. Expect a strong wind blowing from the northwest, making it feel even colder.\",\"Afternoon\":\"Afternoon, March 22nd, will be mostly cloudy with a high chance of scattered showers and light snow. Temperatures will be around 5-7 degrees Celsius. Expect a strong wind blowing from the northwest, making it feel even colder. Be prepared for icy conditions and reduced visibility.\",\"Evening\":\"Evening, March 22nd, will be mostly cloudy with a high chance of scattered showers and light snow. Temperatures will be around 0-2 degrees Celsius. Expect a strong wind blowing from the northwest, making it feel even colder. Be prepared for icy conditions and reduced visibility.\",\"time\":\"20210322000000\",\"note\":\"\"},{\"daily\":\"It\\'s going to be a chilly day with ice fog in the early morning, gradually clearing up to partly sunny skies by the afternoon. Expect a temperature drop in the late afternoon, with a high of around 5\\\\u00b0C and a low of around 2\\\\u00b0C. Winds will be moderate, blowing from the south at around 20 km\\\\/h.\",\"Early Morning\":\"Early morning will be icy and foggy, with temperatures around -4\\\\u00b0C. Expect moderate winds blowing from the south at around 20 km\\\\/h.\",\"Morning\":\"Morning will see a gradual clearing of the fog, with partly sunny skies and temperatures around 2\\\\u00b0C. Winds will remain moderate, blowing from the south at around 20 km\\\\/h.\",\"Afternoon\":\"Afternoon will be partly sunny, with temperatures around 5\\\\u00b0C. Expect moderate winds blowing from the south at around 20 km\\\\/h, with a slight drop in temperature in the late afternoon.\",\"Evening\":\"Evening will be partly cloudy, with temperatures around 2\\\\u00b0C. Winds will remain moderate, blowing from the south at around 20 km\\\\/h.\",\"time\":\"20210323000000\",\"note\":\"\"},{\"daily\":\"It\\'s going to be a chilly day in March with a mix of sun and clouds. Expect a temperature drop in the late afternoon, with a chance of light snow and ice fog. The wind will be moderate to strong throughout the day, with a slight increase in humidity in the evening.\",\"Early Morning\":\"Early morning will be partly cloudy with a moderate wind. The temperature will be around 2-3\\\\u00b0C, with a slight increase in humidity.\",\"Morning\":\"In the morning, the sky will be mostly cloudy with a moderate wind. The temperature will be around 5-6\\\\u00b0C, with a slight decrease in humidity.\",\"Afternoon\":\"In the afternoon, the sky will be broken clouds with a moderate wind. The temperature will be around 8-9\\\\u00b0C, with a slight increase in humidity.\",\"Evening\":\"In the evening, the sky will be mostly cloudy with a strong wind. The temperature will be around 0-1\\\\u00b0C, with a significant increase in humidity and a chance of light snow and ice fog.\",\"time\":\"20210324000000\",\"note\":\"\"},{\"daily\":\"It\\'s going to be a cold and snowy day on March 25th. Expect light snow and low clouds throughout the day, with a temperature trend of dropping to -5\\\\u00b0C by the evening. Be prepared for icy roads and reduced visibility. The wind will be blowing from the north at a moderate speed, and the humidity will be high, around 93%. As the day progresses, the snow flurries will become more frequent, and the temperature will continue to drop. It\\'s a good idea to stay indoors and avoid traveling unless necessary.\",\"Early Morning\":\"Early morning on March 25th will be quite chilly, with a temperature of around -1\\\\u00b0C. Expect light snow and low clouds, with a moderate wind blowing from the north. The humidity will be high, around 93%, and the visibility will be reduced due to the snow. It\\'s a good idea to bundle up and stay indoors.\",\"Morning\":\"Morning on March 25th will be similar to the early morning, with light snow and low clouds. The temperature will drop to around -2\\\\u00b0C, and the wind will continue to blow from the north. The humidity will remain high, around 93%, and the visibility will be reduced. It\\'s still a good idea to stay indoors and avoid traveling unless necessary.\",\"Afternoon\":\"Afternoon on March 25th will see a slight improvement in the weather, with the snow flurries becoming more frequent. The temperature will drop to around -5\\\\u00b0C, and the wind will continue to blow from the north. The humidity will remain high, around 93%, and the visibility will be reduced. It\\'s still a good idea to stay indoors and avoid traveling unless necessary.\",\"Evening\":\"Evening on March 25th will be quite cold, with a temperature of around -5\\\\u00b0C. Expect light snow and low clouds, with a moderate wind blowing from the north. The humidity will be high, around 93%, and the visibility will be reduced due to the snow. It\\'s a good idea to stay indoors and avoid traveling unless necessary.\",\"time\":\"20210325000000\",\"note\":\"\"},{\"daily\":\"It\\'s going to be a chilly day in March, with a mix of light snow and ice fog. The temperature will fluctuate between -5\\\\u00b0C and 2\\\\u00b0C, with a general trend of warming up slightly towards the end of the day. Expect mostly cloudy skies with some scattered clouds and snow flurries. The wind will be moderate to strong, blowing from various directions. It\\'s a good idea to bundle up and stay warm!\",\"Early Morning\":\"Early morning will be quite chilly, with temperatures around -5\\\\u00b0C. Expect light snow and ice fog, with moderate winds blowing from the east-southeast. It\\'s a good idea to dress warmly and stay indoors if possible.\",\"Morning\":\"Morning will see a slight warming trend, with temperatures rising to around -2\\\\u00b0C. Expect light snow and broken clouds, with moderate winds blowing from the south. It\\'s a good idea to take a warm drink with you on your way out.\",\"Afternoon\":\"Afternoon will be quite pleasant, with temperatures rising to around 2\\\\u00b0C. Expect mostly cloudy skies with some scattered clouds and snow flurries. The wind will be moderate to strong, blowing from various directions. It\\'s a good idea to take a break and enjoy the scenery.\",\"Evening\":\"Evening will see a slight cooling trend, with temperatures dropping to around 0\\\\u00b0C. Expect light snow and partly cloudy skies, with moderate winds blowing from the east-northeast. It\\'s a good idea to bundle up and stay warm.\",\"time\":\"20210326000000\",\"note\":\"\"}]'"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "instance[4]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## try with openai API"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# ts_x, ts_y, tm_x, tm_y, (dy_tm_x, general, channel, [dy_x]), (dy_tm_y, general, channel, [dy_y])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "import openai"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "openai.base_url = 'http://localhost:8021/v1/'\n",
    "openai.api_key = 'EMPTY'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "system_prompt = \"You are a professonal data analyst. You can do the forecasting by considering the historical time series readings along with weather condition and make the prediction for the next 24 hours. \" + seta[2000][4][1] + \"Please directly do the forecasting without any further external tools such as coding. You can consider the periodicity, trend, and seasonality of the data. Then consider the affect of weather condition to further refine your prediction. The time period are defined as follows, 0~6 as Early morning, 7~12 as Morning, 13~18 as Afternoon, 19~24 as Evening. \"\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'The solar panel is located at Calgary Fire Hall Headquarters.'"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x_ts = instance[0].squeeze().tolist()\n",
    "x_timestamp = instance[2].tolist()\n",
    "x_table = [(x_timestamp[i], x_ts[i]) for i in range(len(x_ts))]\n",
    "\n",
    "x_dy = instance[4][-1]\n",
    "x_dy_timestamp = instance[4][0]\n",
    "x_dy_table = [(x_dy_timestamp[i], x_dy[i]) for i in range(len(x_dy))]\n",
    "\n",
    "channel_info = instance[4][2]\n",
    "channel_info"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('20210326000000',\n",
       "  '{\"daily\":\"It\\'s going to be a chilly day in March, with a mix of light snow and ice fog. The temperature will fluctuate between -5\\\\u00b0C and 2\\\\u00b0C, with a general trend of warming up slightly towards the end of the day. Expect mostly cloudy skies with some scattered clouds and snow flurries. The wind will be moderate to strong, blowing from various directions. It\\'s a good idea to bundle up and stay warm!\",\"Early Morning\":\"Early morning will be quite chilly, with temperatures around -5\\\\u00b0C. Expect light snow and ice fog, with moderate winds blowing from the east-southeast. It\\'s a good idea to dress warmly and stay indoors if possible.\",\"Morning\":\"Morning will see a slight warming trend, with temperatures rising to around -2\\\\u00b0C. Expect light snow and broken clouds, with moderate winds blowing from the south. It\\'s a good idea to take a warm drink with you on your way out.\",\"Afternoon\":\"Afternoon will be quite pleasant, with temperatures rising to around 2\\\\u00b0C. Expect mostly cloudy skies with some scattered clouds and snow flurries. The wind will be moderate to strong, blowing from various directions. It\\'s a good idea to take a break and enjoy the scenery.\",\"Evening\":\"Evening will see a slight cooling trend, with temperatures dropping to around 0\\\\u00b0C. Expect light snow and partly cloudy skies, with moderate winds blowing from the east-northeast. It\\'s a good idea to bundle up and stay warm.\",\"time\":\"20210326000000\",\"note\":\"\"}'),\n",
       " ('20210327000000',\n",
       "  '{\"daily\":\"It\\'s going to be a chilly day on March 27th, with ice fog in the early morning and partly sunny skies in the afternoon. Temperatures will be dropping throughout the day, with a low of -3\\\\u00b0C in the late afternoon. Expect a gentle breeze blowing from the south to north, with wind speeds ranging from 6 to 17 km\\\\/h. Humidity will be relatively high, around 70-90%, with a slight decrease in the afternoon.\",\"Early Morning\":\"Early morning on March 27th will be quite chilly, with ice fog and temperatures around -2\\\\u00b0C. Expect a gentle breeze blowing from the south to north, with wind speeds around 11 km\\\\/h. Humidity will be high, around 93%.\",\"Morning\":\"Morning on March 27th will see a slight improvement in weather, with partly sunny skies and temperatures around 0\\\\u00b0C. Expect a gentle breeze blowing from the south-southwest to north-northeast, with wind speeds around 15 km\\\\/h. Humidity will be relatively high, around 75%.\",\"Afternoon\":\"Afternoon on March 27th will be partly sunny, with temperatures around 12\\\\u00b0C. Expect a gentle breeze blowing from the west to east, with wind speeds around 15 km\\\\/h. Humidity will be relatively low, around 28-32%.\",\"Evening\":\"Evening on March 27th will see a slight drop in temperature, with partly cloudy skies and temperatures around 9\\\\u00b0C. Expect a gentle breeze blowing from the southwest to northeast, with wind speeds around 9 km\\\\/h. Humidity will be relatively high, around 37%.\",\"time\":\"20210327000000\",\"note\":\"\"}')]"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_ts = instance[1].squeeze().tolist()\n",
    "y_timestamp = instance[3].tolist()\n",
    "\n",
    "y_dy = instance[5][-1]\n",
    "y_dy_timestamp = instance[5][0]\n",
    "y_dy_table = [(y_dy_timestamp[i], y_dy[i]) for i in range(len(y_dy))]\n",
    "y_dy_table"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "user_prompt = f'''\n",
    "\n",
    "We now have the data from {channel_info}. The historical data is as follows:\n",
    "\n",
    "{x_table}\n",
    "\n",
    "The historical weather condition is as follows:\n",
    "\n",
    "{x_dy_table}\n",
    "\n",
    "We now have the weather forecasting for the following days:\n",
    "\n",
    "{y_dy_table}\n",
    "\n",
    "Please make the prediction for the next 24 hours.\n",
    "\n",
    "The timestamp for forecasting is as follows:\n",
    "\n",
    "{y_timestamp}\n",
    "\n",
    "Please format it in json format in [datastamp, value] pair, as below:\n",
    "\n",
    "```json\n",
    "\n",
    "[[<timestamp>, <predicted_value>],\n",
    " [<timestamp>, <predicted_value>],\n",
    " ...]\n",
    "\n",
    "```\n",
    "'''"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "messages = [\n",
    "    {'role': 'system', 'content': system_prompt},\n",
    "    {'role': 'user', 'content': user_prompt}\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['Qwen/QwQ-32B']"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "avaliable_models = openai.models.list()\n",
    "avaliable_models = [model.id for model in avaliable_models.data]\n",
    "avaliable_models"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "import re"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "def extract_result(result):\n",
    "    pattern = r'```json(.*?)```'\n",
    "    result = re.search(pattern, result, re.DOTALL)\n",
    "    pred = json.loads(result.group(1))\n",
    "\n",
    "    return pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [],
   "source": [
    "# do multi processing\n",
    "import multiprocessing\n",
    "\n",
    "def call_openai(model_id, messages):\n",
    "    temp = 0.2\n",
    "    # if 'DeepSeek' in model_id:\n",
    "    messages[1]['content']=messages[0]['content']+messages[1]['content']\n",
    "    messages[0]['content']=''\n",
    "    temp = 0.6\n",
    "    response = openai.chat.completions.create(\n",
    "        model=model_id,\n",
    "        messages=messages,\n",
    "        temperature=temp,\n",
    "    )\n",
    "    extracted = extract_result(response.choices[0].message.content)\n",
    "    return extracted, response.choices[0].message.content, model_id\n",
    "    # return response.choices[0].message.content\n",
    "\n",
    "pool = multiprocessing.Pool(processes=4)\n",
    "results = pool.starmap(call_openai, [(model_id, messages) for model_id in avaliable_models])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[([['20210326080000', 0.4],\n",
       "   ['20210326090000', 1.0],\n",
       "   ['20210326100000', 2.5],\n",
       "   ['20210326110000', 3.8],\n",
       "   ['20210326120000', 4.5],\n",
       "   ['20210326130000', 4.0],\n",
       "   ['20210326140000', 3.2],\n",
       "   ['20210326150000', 2.5],\n",
       "   ['20210326160000', 1.8],\n",
       "   ['20210326170000', 1.0],\n",
       "   ['20210326180000', 0.4],\n",
       "   ['20210326190000', 0.1],\n",
       "   ['20210326200000', 0.0],\n",
       "   ['20210326210000', 0.0],\n",
       "   ['20210326220000', 0.0],\n",
       "   ['20210326230000', 0.0],\n",
       "   ['20210327000000', 0.0],\n",
       "   ['20210327010000', 0.0],\n",
       "   ['20210327020000', 0.0],\n",
       "   ['20210327030000', 0.0],\n",
       "   ['20210327040000', 0.0],\n",
       "   ['20210327050000', 0.0],\n",
       "   ['20210327060000', 0.0],\n",
       "   ['20210327070000', 0.01]],\n",
       "  '<think>\\nOkay, let\\'s tackle this forecasting problem. So, the user wants me to predict the next 24 hours of solar power generation for the Calgary Fire Hall Headquarters solar panels. They provided historical data from March 19 to March 25, 2021, along with weather conditions and forecasts for March 26 and 27. I need to use this data without any external tools, so I\\'ll have to do this manually by analyzing the patterns and considering weather impacts.\\n\\nFirst, I should look at the historical solar data to understand the trends, periodicity, and seasonality. The data is hourly, so I can see the daily cycles. Looking at the timestamps, each day has a clear pattern with generation starting near zero in the early morning, peaking around noon, and dropping back to zero in the evening. Let me check the patterns over the days provided.\\n\\nLooking at March 19: The peak was around 11.733 at 12:00, then 13.264 at 13:00, but then it starts to decline. The next day, March 20, the peak is higher at 13.41. March 21 peaks at 14.349, which is even higher. March 22, though, shows a significant drop to 8.722 at noon, probably due to weather. On March 23, the peak is again high at 14.349. March 24 has lower peaks, maybe due to cloudiness, and March 25 is very low, almost zero, likely because of snow.\\n\\nNow, the weather data from the historical and forecasted periods will affect the solar generation. The key factors are cloud cover, precipitation (like snow), and temperature, but since solar panels are affected more by sunlight, I\\'ll focus on cloud cover and precipitation.\\n\\nThe weather forecast for March 26 (the day we need to predict starting from 8 AM) says: light snow and ice fog throughout the day, temperatures between -5°C and 2°C. The afternoon might be slightly better with 2°C, but still with snow flurries. The evening cools down again. So, overall, it\\'s not ideal for solar generation. The forecast for March 27 morning has ice fog but then partly sunny skies in the afternoon with higher temperatures (up to 12°C). That suggests better conditions on the 27th afternoon.\\n\\nWait, the timestamps start at 20210326080000 (March 26, 8 AM) and go through March 27 7 AM. So the prediction needs to cover 24 hours starting March 26 8 AM.\\n\\nFirst, let\\'s break down the days:\\n\\n- March 26 (forecast day 1): The weather is cold with light snow and ice fog. The solar generation is likely going to be low throughout the day because of the clouds and snow, which block sunlight. The historical data on days with similar weather (like March 25) had very low generation. For example, on March 25, most of the day had near-zero except a slight rise in the morning but then dropped to almost nothing. So maybe on March 26, the solar output will be minimal, maybe peaking around noon but not very high.\\n\\nLooking at the March 25 data: The highest was 0.354 at 15:00, but most were near zero. So maybe on March 26, similar conditions would lead to low numbers. Let\\'s check the forecast details:\\n\\nMarch 26\\'s weather:\\n\\n- Early Morning (-5°C, light snow, ice fog, moderate winds): So from midnight to 6 AM, but our prediction starts at 8 AM. So 8 AM is part of the morning period.\\n\\nThe Morning on March 26 (per the weather data) has temperatures rising to -2°C, light snow and broken clouds. The wind is from the south. So the morning (7-12) might have some sun but still overcast. Let\\'s see the time periods:\\n\\nThe user defined the periods as:\\n\\n0~6: Early morning,\\n\\n7~12: Morning,\\n\\n13~18: Afternoon,\\n\\n19~24: Evening.\\n\\nSo March 26\\'s morning (7-12) would be 8 AM to noon. The weather says morning has light snow and broken clouds, so maybe some sun but not full. Let\\'s see the historical data on a similar day. On March 24, the morning had some generation (0.755 at 8 AM, 1.579 at 9 AM, but then at 10 AM it went up to 5.267. Wait, but that day had some fluctuations. However, on March 25, the morning was mostly low. Maybe the key is to look for days with similar weather.\\n\\nLooking at March 22, which had scattered showers and light snow, the generation was very low in the afternoon and evening. On March 22, from 8 AM to 12 PM, generation was 0.337, 2.494, 4.969, 7.635, 8.722 at noon. Wait, that day\\'s afternoon had a peak at noon despite the weather. Hmm, maybe the snow wasn\\'t as heavy then. But March 25 had much worse weather with lower generation.\\n\\nThe forecast for March 26 says afternoon will be \"pleasant\" with 2°C, mostly cloudy and snow flurries. So maybe the peak is around noon but not as high as clear days. Let\\'s consider that on March 26, the peak might be around 8-10 kW, but given the snow, maybe lower.\\n\\nAlternatively, looking at the immediate previous day, March 25, had almost nothing except a tiny blip. But March 26\\'s forecast is a bit better (since temperatures are slightly higher), but still with snow. Let\\'s think of similar days in the data.\\n\\nLooking at March 22\\'s data: Afternoon peak at 10.993 at 14:00, but that day had scattered showers and snow. Maybe the difference is the temperature. March 22\\'s afternoon was 5-7°C, which is warmer than March 26\\'s forecasted 2°C. So maybe March 26\\'s peak would be lower.\\n\\nAlternatively, perhaps March 23 had ice fog but then cleared a bit. On March 23, the peak was 14.349 at noon, which suggests that if the ice fog clears, it can generate well. But March 26\\'s forecast says light snow and ice fog all day. Hmm.\\n\\nWait, the March 26 forecast says \"mostly cloudy skies with some scattered clouds and snow flurries.\" So maybe not completely overcast. Maybe partial sun allows some generation. Let\\'s try to estimate.\\n\\nPerhaps the morning hours (8 AM to noon) will have some generation, but not as high as clear days. Let\\'s look at the March 24 data. March 24 had:\\n\\n8 AM: 0.755\\n\\n9 AM: 1.579\\n\\n10 AM:5.267\\n\\n11 AM: 3.702\\n\\n12 PM: 2.593\\n\\nHmm, that\\'s inconsistent. Maybe because of variable cloud cover. But March 24\\'s weather was partly cloudy with some snow in the afternoon. The peak at 10 AM could be a break in clouds.\\n\\nAlternatively, maybe the best approach is to look at the previous days\\' patterns and adjust based on weather.\\n\\nLooking at the last few days before March 26:\\n\\nOn March 25, the solar data was very low, almost nothing except a tiny peak around 11 AM (0.145). So that was a bad day for solar, likely due to heavy snow.\\n\\nMarch 24 had some generation, but lower than previous days. For example, on March 21, the peak was 14.349. So the trend before March 26 was a decline in solar output due to weather.\\n\\nNow, March 26\\'s forecast is for light snow and ice fog, so probably similar to March 25 but maybe slightly better. Let\\'s assume that the generation on March 26 would be low but not as bad as March 25, except maybe the morning.\\n\\nWait, March 26\\'s morning (7 AM to 12 PM) has temperatures rising to -2°C. The weather says \"light snow and broken clouds.\" Maybe some sun breaks through, so generation could start low but increase to a moderate peak at noon. Let\\'s try to estimate:\\n\\nAssume that the peak on March 26 at noon would be around 5-7 kW, considering the snow and clouds. The morning hours (8 AM to noon) would gradually increase, but not as sharply as on clear days.\\n\\nLooking at March 22\\'s morning data (which had snow showers):\\n\\n8 AM:0.337, 9 AM:2.494, 10 AM:4.969, 11 AM:7.635, 12 PM:8.722. That\\'s a decent increase despite the weather. Maybe the snow wasn\\'t as heavy then.\\n\\nMarch 23\\'s morning had better conditions: 8 AM:0.019, 9 AM:0.303, but then a big jump to 0.99 at 10 AM, then 5.661 at 11, 12.9 at noon. So that day had ice fog but then cleared.\\n\\nSo maybe the key is to see whether the current forecast\\'s cloud cover and snow will allow any solar gain. Since the forecast says \"snow flurries\" and \"light snow,\" maybe some periods have partial sun.\\n\\nAlternatively, comparing to March 25\\'s data, which had almost nothing except a slight rise at 11 AM (0.145). So perhaps March 26 will be similar but with a bit more generation because temperatures are a bit higher?\\n\\nWait, March 25 had a low of -1°C, and March 26\\'s forecast starts at -5°C but warms to 2°C. However, the presence of snow and ice fog would still block sunlight. Maybe the peak is around 3-5 kW.\\n\\nAlternatively, let\\'s consider the following approach:\\n\\n1. Find the most recent days with similar weather conditions to March 26 and use their solar data as a basis.\\n\\nLooking at the weather for March 26: light snow, ice fog, moderate winds. The closest days in the historical data are March 25 (heavy snow, low generation), March 22 (scattered showers and snow), and March 23 (ice fog).\\n\\nMarch 22\\'s solar data on a day with some snow had a peak of ~8.722 at noon. March 23\\'s peak was 14.349 after ice fog cleared. March 25\\'s peak was 0.354.\\n\\nSince March 26\\'s forecast is for light snow and ice fog throughout, maybe similar to March 22 but with lower temperatures. Let\\'s average those days. Maybe the peak would be around 6 kW?\\n\\nAlternatively, since March 26\\'s temperature is colder but the snow is lighter, maybe the effect is a lower peak but still some generation.\\n\\nAnother angle: the solar generation on days with bad weather typically has a low peak and shorter duration. For example, on March 22, the generation started dropping after noon. On March 26, maybe the peak is around 12 PM, then declines.\\n\\nNow, considering the time periods:\\n\\nMarch 26 8 AM to 7 PM (since the prediction goes until March 27 7 AM, which is 24 hours starting at 8 AM on the 26th). So the next 24 hours include all of March 26 and the early morning of March 27.\\n\\nWait the timestamps are from 20210326080000 (March 26 8 AM) up to 20210327070000 (March 27 7 AM). So that\\'s exactly 24 hours.\\n\\nNow, for March 26\\'s weather:\\n\\n- Morning (7-12): light snow, broken clouds, temps -2°C. Maybe some sun breaks, so generation increases from 0.3 to maybe 5 kW by noon.\\n\\n- Afternoon (13-18): mostly cloudy with snow flurries, temps up to 2°C. The peak is at noon, then gradual decline. Maybe 5 kW at 1 PM, dropping to 3 by 5 PM.\\n\\n- Evening (19-24): temps drop to 0°C, light snow. Generation drops to near zero by 7 PM.\\n\\nOn March 27\\'s early morning (0-6 AM), the weather forecast says ice fog but then partly sunny in the afternoon. However, the prediction only includes up to 7 AM on the 27th, which is part of the early morning (0~6). So March 27 0~6 AM would be very low, maybe similar to previous mornings with ice fog.\\n\\nLooking at March 23\\'s early morning (ice fog) had 0.019 at 8 AM, but the previous hours were zero. So maybe March 27\\'s early morning (0~6) would have zero except maybe a tiny blip at 7 AM.\\n\\nPutting this together, here\\'s a possible prediction pattern for March 26:\\n\\n- 8 AM: Starting low, maybe 0.5 kW (similar to March 22\\'s 0.337 but adjusted for snow)\\n\\n- 9 AM: 1.5 kW (like March 22\\'s 2.494)\\n\\n- 10 AM: 3.5 kW (less than March 22\\'s 4.969 due to colder temps?)\\n\\n- 11 AM: 5.0 kW (lower than March 22\\'s 7.635)\\n\\n- 12 PM: 6.0 kW (peak)\\n\\n- 1 PM: 5.5 kW\\n\\n- 2 PM: 4.5 kW\\n\\n- 3 PM: 3.5 kW\\n\\n- 4 PM: 2.5 kW\\n\\n- 5 PM: 1.5 kW\\n\\n- 6 PM: 0.5 kW\\n\\n- 7 PM: 0.1 kW (nearing evening)\\n\\n- 8 PM to midnight: near zero.\\n\\nWait, but the evening period (19-24) on March 26 would be from 7 PM to midnight. The forecast says evening (19-24) has light snow and partly cloudy, temps 0°C. So generation drops to near zero after 7 PM.\\n\\nThen, the next morning (March 27\\'s early morning 0~6) would have ice fog and light snow. The solar generation here would be near zero except maybe a tiny rise at 7 AM (but the forecast\\'s note for March 27\\'s early morning is -2°C and light snow, so likely zero except maybe a small value at 7 AM similar to previous days.\\n\\nLooking at March 23\\'s 7 AM: 0.007, March 24\\'s 7 AM: 0.011, March 25 had 0.0. So maybe March 27\\'s 7 AM would be ~0.01 or 0.0.\\n\\nPutting all this into JSON format for each hour from 8 AM March 26 to 7 AM March 27.\\n\\nNeed to list each timestamp and the predicted value.\\n\\nLet me map each timestamp to the estimated values based on the above pattern.\\n\\nFirst, list all the timestamps provided:\\n\\nThe timestamps given are:\\n\\n[\"20210326080000\", \"20210326090000\", \"20210326100000\", \"20210326110000\", \"20210326120000\", \"20210326130000\", \"20210326140000\", \"20210326150000\", \"20210326160000\", \"20210326170000\", \"20210326180000\", \"20210326190000\", \"20210326200000\", \"20210326210000\", \"20210326220000\", \"20210326230000\", \"20210327000000\", \"20210327010000\", \"20210327020000\", \"20210327030000\", \"20210327040000\", \"20210327050000\", \"20210327060000\", \"20210327070000\"]\\n\\nNow, assigning values:\\n\\nStarting with March 26:\\n\\n8 AM (20210326080000): 0.5\\n\\n9 AM: 1.5\\n\\n10 AM: 3.5\\n\\n11 AM: 5.0\\n\\n12 PM: 6.0\\n\\n1 PM (20210326130000): 5.5\\n\\n2 PM (1400): 4.5\\n\\n3 PM (1500): 3.5\\n\\n4 PM (1600): 2.5\\n\\n5 PM (1700): 1.5\\n\\n6 PM (1800): 0.5\\n\\n7 PM (1900): 0.1 (since evening starts, generation drops)\\n\\n8 PM (2000): 0.0\\n\\n9 PM (2100): 0.0\\n\\n10 PM (2200): 0.0\\n\\n11 PM (2300): 0.0\\n\\nMidnight (20210326230000 is actually 23:00, but the next one is 20210327000000 (midnight). So midnight to 7 AM on March 27:\\n\\n20210327000000 (0 AM): 0.0\\n\\n1 AM: 0.0\\n\\n2 AM: 0.0\\n\\n3 AM: 0.0\\n\\n4 AM: 0.0\\n\\n5 AM: 0.0\\n\\n6 AM: 0.0\\n\\n7 AM (20210327070000): maybe 0.01\\n\\nWait, the last timestamp is 20210327070000 (7 AM). So for that, similar to previous 7 AMs on same days, like March 25 had 0.003 at 7 AM, March 24 had 0.011. So perhaps 0.01.\\n\\nSo the values would be as follows:\\n\\n[\\n[\"20210326080000\", 0.5],\\n[\"20210326090000\", 1.5],\\n[\"20210326100000\", 3.5],\\n[\"20210326110000\", 5.0],\\n[\"20210326120000\", 6.0],\\n[\"20210326130000\", 5.5],\\n[\"20210326140000\", 4.5],\\n[\"20210326150000\", 3.5],\\n[\"20210326160000\", 2.5],\\n[\"20210326170000\", 1.5],\\n[\"20210326180000\", 0.5],\\n[\"20210326190000\", 0.1],\\n[\"20210326200000\", 0.0],\\n[\"20210326210000\", 0.0],\\n[\"20210326220000\", 0.0],\\n[\"20210326230000\", 0.0],\\n[\"20210327000000\", 0.0],\\n[\"20210327010000\", 0.0],\\n[\"20210327020000\", 0.0],\\n[\"20210327030000\", 0.0],\\n[\"20210327040000\", 0.0],\\n[\"20210327050000\", 0.0],\\n[\"20210327060000\", 0.0],\\n[\"20210327070000\", 0.01]\\n]\\n\\nWait, but maybe the evening drop is faster. Like after 7 PM, it goes to zero. Also, the 7 PM (1900) might be 0.1, but the next hours are zero. The morning of March 27\\'s 7 AM is 0.01.\\n\\nAlternatively, maybe the peak is a bit lower. Let me check again the previous days.\\n\\nMarch 22\\'s peak was 8.722 at noon with similar weather (scattered showers and snow). March 23 had a higher peak when ice fog cleared. Since March 26\\'s forecast has snow flurries, maybe the peak is around 5 kW instead of 6.\\n\\nPerhaps adjusting the peak down a bit. Let me recalculate with a peak of 5 kW at noon:\\n\\n8 AM: 0.3\\n\\n9 AM:1.0\\n\\n10 AM: 2.5\\n\\n11 AM:4.0\\n\\n12 PM:5.0\\n\\n1PM:4.5\\n\\n2PM:3.5\\n\\n3PM:2.5\\n\\n4PM:1.5\\n\\n5PM:0.8\\n\\n6PM:0.2\\n\\n7PM:0.05\\n\\nThen evening zeros.\\n\\nHmm, that might be more conservative. But I need to consider that on March 22, despite snow, they had 8.7 at noon. But March 26 is colder, so maybe less.\\n\\nAlternatively, maybe a peak of 4 kW.\\n\\nAlternatively, looking at March 25, which had worse weather, had a peak of 0.354 at 15:00. So perhaps March 26\\'s peak is higher, but still lower than typical days. Maybe 3-4 kW.\\n\\nHmm, perhaps I should take an average between March 22 and March 25. March 22 had 8.7, March 25 had 0.354. Let\\'s say 4.5.\\n\\nAlternatively, maybe the peak is 3.0.\\n\\nAlternatively, maybe I need to consider that the snow is light, so partial sun allows some generation. Let\\'s try:\\n\\nPeak at noon: 4 kW.\\n\\nThen:\\n\\n8 AM: 0.5\\n\\n9 AM:1.2\\n\\n10 AM:2.5\\n\\n11 AM:3.5\\n\\n12 PM:4.0\\n\\n1 PM:3.5\\n\\n2 PM:2.8\\n\\n3 PM:2.0\\n\\n4 PM:1.2\\n\\n5 PM:0.6\\n\\n6 PM:0.2\\n\\n7 PM:0.05\\n\\nThen the evening zeros.\\n\\nThe morning of March 27\\'s 7 AM is 0.01.\\n\\nAlternatively, perhaps the morning of March 27 is even worse? The forecast for March 27\\'s early morning says ice fog and -2°C. Similar to March 23, which had 0.019 at 8 AM. So 7 AM might be 0.01.\\n\\nAlternatively, maybe March 27\\'s morning is even colder, so even lower.\\n\\nBut the key is to stay consistent with the given data and forecast.\\n\\nAlternatively, maybe the peak on March 26 is around 5 kW, considering that the snow is light and there might be some sun breaks.\\n\\nAnother approach: The previous day (March 25) had almost nothing, so perhaps March 26, being the next day with similar but slightly better conditions, would have a slight increase. For example, the peak on March 25 was 0.354, so maybe March 26 has a peak of 1.5 times that, so ~0.5 kW? But that seems too low.\\n\\nWait, maybe I\\'m overcomplicating. Let me look at March 22\\'s data again. On March 22, despite the weather, the solar generation was still decent (8.7 at noon). So maybe the key factor is whether the sky is partially clear.\\n\\nMarch 26\\'s forecast mentions \"mostly cloudy skies with some scattered clouds and snow flurries.\" So maybe there are partial clearings. Hence, the generation can reach moderate levels.\\n\\nComparing to March 22\\'s data:\\n\\nMarch 22\\'s solar data:\\n\\n8 AM:0.337, 9:2.494, 10:4.969, 11:7.635, 12:8.722. So a steady increase.\\n\\nGiven that March 26 is colder (max temp 2°C vs March 22\\'s 7°C), maybe the peak is lower. Perhaps 60-70% of March 22\\'s peak.\\n\\n8.722 * 0.7 = ~6.1, so maybe 6 kW at noon. But with snow, maybe 5 kW.\\n\\nAlternatively, since the temperature is lower, the solar irradiance might be less, so lower peak. Let\\'s go with 4.5 kW.\\n\\nSo revising:\\n\\n8 AM: 0.4\\n\\n9 AM:1.0\\n\\n10 AM:2.5\\n\\n11 AM:3.8\\n\\n12 PM:4.5\\n\\n1 PM:4.0\\n\\n2 PM:3.2\\n\\n3 PM:2.5\\n\\n4 PM:1.8\\n\\n5 PM:1.0\\n\\n6 PM:0.4\\n\\n7 PM:0.1\\n\\nThen evening zeros.\\n\\nBut need to align with the timestamps provided. Let me structure the final JSON accordingly.\\n</think>\\n\\n```json\\n[\\n  [\"20210326080000\", 0.4],\\n  [\"20210326090000\", 1.0],\\n  [\"20210326100000\", 2.5],\\n  [\"20210326110000\", 3.8],\\n  [\"20210326120000\", 4.5],\\n  [\"20210326130000\", 4.0],\\n  [\"20210326140000\", 3.2],\\n  [\"20210326150000\", 2.5],\\n  [\"20210326160000\", 1.8],\\n  [\"20210326170000\", 1.0],\\n  [\"20210326180000\", 0.4],\\n  [\"20210326190000\", 0.1],\\n  [\"20210326200000\", 0.0],\\n  [\"20210326210000\", 0.0],\\n  [\"20210326220000\", 0.0],\\n  [\"20210326230000\", 0.0],\\n  [\"20210327000000\", 0.0],\\n  [\"20210327010000\", 0.0],\\n  [\"20210327020000\", 0.0],\\n  [\"20210327030000\", 0.0],\\n  [\"20210327040000\", 0.0],\\n  [\"20210327050000\", 0.0],\\n  [\"20210327060000\", 0.0],\\n  [\"20210327070000\", 0.01]\\n]\\n```',\n",
       "  'Qwen/QwQ-32B')]"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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fR5U+T3oC0Wxp3cIBzZXWXmIRERkMl07Qc8//zw6OjowdepUeDweeDwebN++Hd///vcxffp0PX8UERFRVsQoXKDMjSqfeu+vtSbRDdrdE0r7dUREZF+6doK+8pWvYMmSJSkfW7p0Kb7yla/g/PPP1/NHERERZUWbDKedUphY68fGvX3Y0ztk1aEREZFFci6C+vv7sWXLFuXP27Ztw7p161BfX4+pU6eioaEh5fFlZWVoaWnBrFmzCj9aIiKiHIlO0ITq1NHriewEERE5Vs5F0BtvvIETTzxR+fOll14KADj33HNxxx136HZgREREehgZiiC0JtcHsRNEROQ8ORdBixcvRi5bC3300Ue5/ggiIiLdtCudoNQiaGJtohO0p5edICIip9E9IpuIiKiYdAQTG3KPKoKSnaDdPewEERE5DYsgIiKytfYRG6UKE5VxuFBOEw5EVDwkSRr3109/+lOrD5GKlK7pcERERMVGrAka3QlKjMMNDscQHIqiprzM9GMjosLs2bNH+f19992Hq666Chs3blQ+VllZqfxelmXEYjF4PLz8JXaCiIjIxuJxGR196dPhAl436pKFz26GIxCVpJaWFuVXTU0NJElS/rxhwwZUVVXh3//+N4488kj4fD688MILOO+883DmmWemfJ+LL74YixcvVv4cj8excuVKtLW1IRAIYN68eXjggQfM/cuRoVgKExGRbXUPDiMSS4y6NVf5R31+Yk0A3YMR7OkdwsETq80+PKLiJstAZNCan11WDmj29SrE5Zdfjt/85jeYMWMG6urqsvqalStX4q677sKtt96KmTNnYs2aNfjyl7+MpqYmnHDCCbocF1mLRRDZQiQWx2vburBwej28HjY4iShBrAdqrPSmfW1orfXj/T1B7hVElE5kELiu1Zqf/ePdgLdCl2917bXX4uSTT8768eFwGNdddx2efvppHHPMMQCAGTNm4IUXXsBtt93GIsgmWASRLdz7+k5c+fB6nDavFTedPd/qwyGiIrF3jHhsQawL4l5BRPa1YMGCnB6/ZcsWDA4OjiqchoeHMX8+rzHsgkUQ2cK7H/cAAP759m78x5GTcfxBTdYeEBEVhfbe9PHYwsTaZEIcO0FEo5WVJzoyVv1snVRUpHaUXC7XqETISCSi/L6/vx8A8Pjjj2PSpEkpj/P5UtcWUuliEUS2sLNLvYt71SPr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b8Stt96KV199FRUVFVi6dClCoZDymOXLl+O9997DU089hcceewxr1qzBN7/5TbP+CiVlvOd7cHAQa9euxZVXXom1a9fiwQcfxMaNG3H66aePeuy1116bcs5/97vfNePwS06m8xsATjnllJTn8p577kn5PM/v7GV6vrXP8549e/CXv/wFkiTh85//fMrjeH5nJ5trwEzXJbFYDKeeeiqGh4fx0ksv4c4778Qdd9yBq666KreDkSmto446Sl6xYoXy51gsJre2tsorV6608KjsqaOjQwYgr169WvnYCSecIF900UXWHZSNXH311fK8efPSfq6np0cuKyuT77//fuVjH3zwgQxAfvnll006Qvu76KKL5AMOOECOx+OyLPP81hMA+aGHHlL+HI/H5ZaWFvnXv/618rGenh7Z5/PJ99xzjyzLsvz+++/LAOTXX39decy///1vWZIkedeuXaYdeyka+Xyn89prr8kA5O3btysfmzZtmnz99dcbe3A2lO75Pvfcc+UzzjhjzK/h+Z2/bM7vM844Q/7Upz6V8jGe3/kbeQ2YzXXJv/71L9nlcsnt7e3KY2655Ra5urpaDofDWf9sdoLSGB4exptvvoklS5YoH3O5XFiyZAlefvllC4/Mnnp7ewEA9fX1KR//+9//jsbGRhx22GG44oorMDg4aMXh2cLmzZvR2tqKGTNmYPny5dixYwcA4M0330QkEkk512fPno2pU6fyXNfJ8PAw7rrrLnz1q1+FJEnKx3l+G2Pbtm1ob29POadramqwaNEi5Zx++eWXUVtbiwULFiiPWbJkCVwuF1599VXTj9luent7IUkSamtrUz7+y1/+Eg0NDZg/fz5+/etf5zy6QqpVq1ahubkZs2bNwre//W10dnYqn+P5bZy9e/fi8ccfx9e+9rVRn+P5nZ+R14DZXJe8/PLLmDNnDiZMmKA8ZunSpQgGg3jvvfey/tkePf4CdrN//37EYrGUJxcAJkyYgA0bNlh0VPYUj8dx8cUX49hjj8Vhhx2mfPw///M/MW3aNLS2tuKdd97BZZddho0bN+LBBx+08GhL06JFi3DHHXdg1qxZ2LNnD6655hocd9xxWL9+Pdrb2+H1ekddrEyYMAHt7e3WHLDNPPzww+jp6cF5552nfIznt3HEeZvu9Vt8rr29Hc3NzSmf93g8qK+v53lfoFAohMsuuwxn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",
      "text/plain": [
       "<Figure size 1000x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "\n",
    "plt.figure(figsize=(10, 5))\n",
    "\n",
    "plt.plot(np.arange(len(x_ts)), x_ts, label='True')\n",
    "\n",
    "plt.plot(np.arange(len(x_ts), len(x_ts)+len(y_ts)), y_ts, label='True')\n",
    "\n",
    "for result in results:\n",
    "    pred = result[0][:24]\n",
    "    model_id = result[2]\n",
    "    plt.plot(np.arange(len(x_ts), len(x_ts)+len(y_ts)), [x[1] for x in pred], label=model_id)\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "plt.legend()\n",
    "\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'\\n\\nWe now have the data from The solar panel is located at Calgary Fire Hall Headquarters.. The historical data is as follows:\\n\\n[(20210325080000, 0.0), (20210325090000, 0.0), (20210325100000, 0.043), (20210325110000, 0.145), (20210325120000, 0.118), (20210325130000, 0.307), (20210325140000, 0.286), (20210325150000, 0.354), (20210325160000, 0.118), (20210325170000, 0.003), (20210325180000, 0.0), (20210325190000, 0.0), (20210325200000, 0.0), (20210325210000, 0.0), (20210325220000, 0.0), (20210325230000, 0.0), (20210326000000, 0.0), (20210326010000, 0.0), (20210326020000, 0.0), (20210326030000, 0.0), (20210326040000, 0.0), (20210326050000, 0.0), (20210326060000, 0.0), (20210326070000, 0.0), (20210326080000, 0.0), (20210326090000, 0.0), (20210326100000, 0.032), (20210326110000, 0.457), (20210326120000, 1.448), (20210326130000, 1.681), (20210326140000, 2.697), (20210326150000, 2.321), (20210326160000, 2.547), (20210326170000, 2.752), (20210326180000, 1.87), (20210326190000, 0.216), (20210326200000, 0.0), (20210326210000, 0.0), (20210326220000, 0.0), (20210326230000, 0.0), (20210327000000, 0.0), (20210327010000, 0.0), (20210327020000, 0.0), (20210327030000, 0.0), (20210327040000, 0.0), (20210327050000, 0.0), (20210327060000, 0.0), (20210327070000, 0.023), (20210327080000, 1.151), (20210327090000, 3.316), (20210327100000, 5.531), (20210327110000, 8.038), (20210327120000, 13.042), (20210327130000, 12.176), (20210327140000, 11.183), (20210327150000, 8.851), (20210327160000, 8.903), (20210327170000, 4.099), (20210327180000, 1.123), (20210327190000, 0.249), (20210327200000, 0.0), (20210327210000, 0.0), (20210327220000, 0.0), (20210327230000, 0.0), (20210328000000, 0.0), (20210328010000, 0.0), (20210328020000, 0.0), (20210328030000, 0.0), (20210328040000, 0.0), (20210328050000, 0.0), (20210328060000, 0.0), (20210328070000, 0.026), (20210328080000, 0.491), (20210328090000, 2.309), (20210328100000, 5.553), (20210328110000, 8.179), (20210328120000, 12.731), (20210328130000, 14.266), (20210328140000, 14.156), (20210328150000, 12.798), (20210328160000, 7.915), (20210328170000, 3.254), (20210328180000, 1.602), (20210328190000, 0.168), (20210328200000, 0.0), (20210328210000, 0.0), (20210328220000, 0.0), (20210328230000, 0.0), (20210329000000, 0.0), (20210329010000, 0.0), (20210329020000, 0.0), (20210329030000, 0.0), (20210329040000, 0.0), (20210329050000, 0.0), (20210329060000, 0.0), (20210329070000, 0.005), (20210329080000, 0.299), (20210329090000, 2.048), (20210329100000, 4.964), (20210329110000, 6.94), (20210329120000, 11.863), (20210329130000, 14.053), (20210329140000, 13.987), (20210329150000, 13.494), (20210329160000, 11.36), (20210329170000, 7.982), (20210329180000, 3.843), (20210329190000, 0.529), (20210329200000, 0.0), (20210329210000, 0.0), (20210329220000, 0.0), (20210329230000, 0.0), (20210330000000, 0.0), (20210330010000, 0.0), (20210330020000, 0.0), (20210330030000, 0.0), (20210330040000, 0.0), (20210330050000, 0.0), (20210330060000, 0.0), (20210330070000, 0.125), (20210330080000, 1.504), (20210330090000, 3.929), (20210330100000, 6.343), (20210330110000, 8.661), (20210330120000, 13.408), (20210330130000, 14.59), (20210330140000, 14.38), (20210330150000, 11.317), (20210330160000, 8.285), (20210330170000, 2.892), (20210330180000, 3.385), (20210330190000, 0.608), (20210330200000, 0.0), (20210330210000, 0.0), (20210330220000, 0.0), (20210330230000, 0.0), (20210331000000, 0.0), (20210331010000, 0.0), (20210331020000, 0.0), (20210331030000, 0.0), (20210331040000, 0.0), (20210331050000, 0.0), (20210331060000, 0.0), (20210331070000, 0.153), (20210331080000, 1.764), (20210331090000, 3.918), (20210331100000, 6.249), (20210331110000, 8.578), (20210331120000, 13.493), (20210331130000, 14.533), (20210331140000, 14.323), (20210331150000, 12.963), (20210331160000, 10.707), (20210331170000, 7.495), (20210331180000, 2.11), (20210331190000, 0.238), (20210331200000, 0.0), (20210331210000, 0.0), (20210331220000, 0.0), (20210331230000, 0.0), (20210401000000, 0.0), (20210401010000, 0.0), (20210401020000, 0.0), (20210401030000, 0.0), (20210401040000, 0.0), (20210401050000, 0.0), (20210401060000, 0.0), (20210401070000, 0.164)]\\n\\nThe historical weather condition is as follows:\\n\\n[(\\'20210325000000\\', \\'{\"daily\":\"It\\\\\\'s going to be a cold and snowy day on March 25th. Expect light snow and low clouds throughout the day, with a temperature trend of dropping to -5\\\\\\\\u00b0C by the evening. Be prepared for icy roads and reduced visibility. The wind will be blowing from the north at a moderate speed, and the humidity will be high, around 93%. As the day progresses, the snow flurries will become more frequent, and the temperature will continue to drop. It\\\\\\'s a good idea to stay indoors and avoid traveling unless necessary.\",\"Early Morning\":\"Early morning on March 25th will be quite chilly, with a temperature of around -1\\\\\\\\u00b0C. Expect light snow and low clouds, with a moderate wind blowing from the north. The humidity will be high, around 93%, and the visibility will be reduced due to the snow. It\\\\\\'s a good idea to bundle up and stay indoors.\",\"Morning\":\"Morning on March 25th will be similar to the early morning, with light snow and low clouds. The temperature will drop to around -2\\\\\\\\u00b0C, and the wind will continue to blow from the north. The humidity will remain high, around 93%, and the visibility will be reduced. It\\\\\\'s still a good idea to stay indoors and avoid traveling unless necessary.\",\"Afternoon\":\"Afternoon on March 25th will see a slight improvement in the weather, with the snow flurries becoming more frequent. The temperature will drop to around -5\\\\\\\\u00b0C, and the wind will continue to blow from the north. The humidity will remain high, around 93%, and the visibility will be reduced. It\\\\\\'s still a good idea to stay indoors and avoid traveling unless necessary.\",\"Evening\":\"Evening on March 25th will be quite cold, with a temperature of around -5\\\\\\\\u00b0C. Expect light snow and low clouds, with a moderate wind blowing from the north. The humidity will be high, around 93%, and the visibility will be reduced due to the snow. It\\\\\\'s a good idea to stay indoors and avoid traveling unless necessary.\",\"time\":\"20210325000000\",\"note\":\"\"}\\'), (\\'20210326000000\\', \\'{\"daily\":\"It\\\\\\'s going to be a chilly day in March, with a mix of light snow and ice fog. The temperature will fluctuate between -5\\\\\\\\u00b0C and 2\\\\\\\\u00b0C, with a general trend of warming up slightly towards the end of the day. Expect mostly cloudy skies with some scattered clouds and snow flurries. The wind will be moderate to strong, blowing from various directions. It\\\\\\'s a good idea to bundle up and stay warm!\",\"Early Morning\":\"Early morning will be quite chilly, with temperatures around -5\\\\\\\\u00b0C. Expect light snow and ice fog, with moderate winds blowing from the east-southeast. It\\\\\\'s a good idea to dress warmly and stay indoors if possible.\",\"Morning\":\"Morning will see a slight warming trend, with temperatures rising to around -2\\\\\\\\u00b0C. Expect light snow and broken clouds, with moderate winds blowing from the south. It\\\\\\'s a good idea to take a warm drink with you on your way out.\",\"Afternoon\":\"Afternoon will be quite pleasant, with temperatures rising to around 2\\\\\\\\u00b0C. Expect mostly cloudy skies with some scattered clouds and snow flurries. The wind will be moderate to strong, blowing from various directions. It\\\\\\'s a good idea to take a break and enjoy the scenery.\",\"Evening\":\"Evening will see a slight cooling trend, with temperatures dropping to around 0\\\\\\\\u00b0C. Expect light snow and partly cloudy skies, with moderate winds blowing from the east-northeast. It\\\\\\'s a good idea to bundle up and stay warm.\",\"time\":\"20210326000000\",\"note\":\"\"}\\'), (\\'20210327000000\\', \\'{\"daily\":\"It\\\\\\'s going to be a chilly day on March 27th, with ice fog in the early morning and partly sunny skies in the afternoon. Temperatures will be dropping throughout the day, with a low of -3\\\\\\\\u00b0C in the late afternoon. Expect a gentle breeze blowing from the south to north, with wind speeds ranging from 6 to 17 km\\\\\\\\/h. Humidity will be relatively high, around 70-90%, with a slight decrease in the afternoon.\",\"Early Morning\":\"Early morning on March 27th will be quite chilly, with ice fog and temperatures around -2\\\\\\\\u00b0C. Expect a gentle breeze blowing from the south to north, with wind speeds around 11 km\\\\\\\\/h. Humidity will be high, around 93%.\",\"Morning\":\"Morning on March 27th will see a slight improvement in weather, with partly sunny skies and temperatures around 0\\\\\\\\u00b0C. Expect a gentle breeze blowing from the south-southwest to north-northeast, with wind speeds around 15 km\\\\\\\\/h. Humidity will be relatively high, around 75%.\",\"Afternoon\":\"Afternoon on March 27th will be partly sunny, with temperatures around 12\\\\\\\\u00b0C. Expect a gentle breeze blowing from the west to east, with wind speeds around 15 km\\\\\\\\/h. Humidity will be relatively low, around 28-32%.\",\"Evening\":\"Evening on March 27th will see a slight drop in temperature, with partly cloudy skies and temperatures around 9\\\\\\\\u00b0C. Expect a gentle breeze blowing from the southwest to northeast, with wind speeds around 9 km\\\\\\\\/h. Humidity will be relatively high, around 37%.\",\"time\":\"20210327000000\",\"note\":\"\"}\\'), (\\'20210328000000\\', \\'{\"daily\":\"It\\\\\\'s going to be a partly cloudy day with a temperature trend of warming up in the morning and cooling down in the evening. Expect a gentle breeze with a moderate wind speed. There might be some scattered showers in the late afternoon, but overall, it\\\\\\'s going to be a pleasant day.\",\"Early Morning\":\"Early morning will be partly cloudy with a gentle breeze. The temperature will be around 6-9\\\\\\\\u00b0C, and the wind speed will be moderate. Expect a pleasant start to the day.\",\"Morning\":\"In the morning, the weather will be partly sunny with a gentle breeze. The temperature will be around 10-14\\\\\\\\u00b0C, and the wind speed will be moderate. It\\\\\\'s going to be a great day to get out and about.\",\"Afternoon\":\"In the afternoon, the weather will be partly sunny with a gentle breeze. The temperature will be around 10-14\\\\\\\\u00b0C, and the wind speed will be moderate. However, there might be some scattered showers in the late afternoon, so it\\\\\\'s a good idea to carry an umbrella.\",\"Evening\":\"In the evening, the weather will be mostly cloudy with a gentle breeze. The temperature will be around 8-10\\\\\\\\u00b0C, and the wind speed will be moderate. It\\\\\\'s going to be a pleasant end to the day.\",\"time\":\"20210328000000\",\"note\":\"\"}\\'), (\\'20210329000000\\', \\'{\"daily\":\"It\\\\\\'s going to be a cold day tomorrow, March 29th, in the early spring season. Expect light snow and overcast weather throughout the day, with temperatures ranging from -2\\\\\\\\u00b0C to -11\\\\\\\\u00b0C. The wind will be blowing at moderate speeds, and humidity will be relatively high. There might be a slight drop in temperature in the late afternoon, but overall, it will be a chilly day.\",\"Early Morning\":\"Early morning, March 29th, will be quite chilly, with temperatures ranging from -2\\\\\\\\u00b0C to -8\\\\\\\\u00b0C. Expect light snow and overcast weather, with moderate winds blowing at 35-44 km\\\\\\\\/h. It will be a relatively cloudy start to the day.\",\"Morning\":\"Morning, March 29th, will see a continuation of light snow and overcast weather, with temperatures ranging from -2\\\\\\\\u00b0C to -7\\\\\\\\u00b0C. The winds will pick up slightly, blowing at 46-52 km\\\\\\\\/h. It will be a bit more windy than the early morning.\",\"Afternoon\":\"Afternoon, March 29th, will see a slight drop in temperature, ranging from -3\\\\\\\\u00b0C to -8\\\\\\\\u00b0C. Expect passing clouds and moderate winds blowing at 31-46 km\\\\\\\\/h. It will be a bit more sunny than the morning, but still quite chilly.\",\"Evening\":\"Evening, March 29th, will see a continuation of passing clouds and moderate winds blowing at 24-35 km\\\\\\\\/h. Temperatures will range from -4\\\\\\\\u00b0C to -8\\\\\\\\u00b0C. It will be a relatively calm end to the day, with a slight drop in temperature.\",\"time\":\"20210329000000\",\"note\":\"\"}\\'), (\\'20210330000000\\', \\'{\"daily\":\"It\\\\\\'s going to be a chilly day on March 30th, with a mix of passing clouds and scattered clouds. Temperatures will fluctuate between -9\\\\\\\\u00b0C and 4\\\\\\\\u00b0C. Expect a moderate wind blowing from the west to east, with gusts reaching up to 28 km\\\\\\\\/h. The humidity will be relatively low, ranging from 23% to 62%. Overall, it\\\\\\'s a typical spring day with a bit of wind and variable temperatures.\",\"Early Morning\":\"Early morning on March 30th will be quite chilly, with temperatures ranging from -9\\\\\\\\u00b0C to -8\\\\\\\\u00b0C. Expect passing clouds and a moderate wind blowing from the west to east, with gusts reaching up to 17 km\\\\\\\\/h. The humidity will be around 53%.\",\"Morning\":\"Morning on March 30th will see temperatures rise slightly, ranging from -10\\\\\\\\u00b0C to -2\\\\\\\\u00b0C. The weather will be mostly passing clouds, with a moderate wind blowing from the southwest to northeast, gusting up to 19 km\\\\\\\\/h. The humidity will be around 40%.\",\"Afternoon\":\"Afternoon on March 30th will be partly sunny, with temperatures ranging from 1\\\\\\\\u00b0C to 4\\\\\\\\u00b0C. Expect a moderate wind blowing from the west to east, with gusts reaching up to 28 km\\\\\\\\/h. The humidity will be relatively low, around 24%.\",\"Evening\":\"Evening on March 30th will see temperatures drop slightly, ranging from 1\\\\\\\\u00b0C to 2\\\\\\\\u00b0C. The weather will be mostly passing clouds, with a moderate wind blowing from the west to east, gusting up to 26 km\\\\\\\\/h. The humidity will be around 32%.\",\"time\":\"20210330000000\",\"note\":\"\"}\\'), (\\'20210331000000\\', \\'{\"daily\":\"It\\\\\\'s going to be a chilly day with a mix of passing clouds and scattered clouds. Temperatures will fluctuate between -3\\\\\\\\u00b0C and 12\\\\\\\\u00b0C. Expect a moderate wind blowing from the west to east, with gusts reaching up to 41 km\\\\\\\\/h. Humidity will range from 21% to 55%. Be prepared for a partly sunny to cloudy day with a slight chance of scattered showers in the late afternoon.\",\"Early Morning\":\"Early morning will be partly sunny with a temperature range of -3\\\\\\\\u00b0C to 3\\\\\\\\u00b0C. Expect a moderate wind blowing from the south to north, with gusts reaching up to 15 km\\\\\\\\/h. Humidity will be around 55%.\",\"Morning\":\"Morning will be mostly cloudy with a temperature range of 6\\\\\\\\u00b0C to 9\\\\\\\\u00b0C. Expect a moderate wind blowing from the west to east, with gusts reaching up to 32 km\\\\\\\\/h. Humidity will be around 25%.\",\"Afternoon\":\"Afternoon will be partly sunny to cloudy with a temperature range of 9\\\\\\\\u00b0C to 12\\\\\\\\u00b0C. Expect a moderate wind blowing from the west to east, with gusts reaching up to 28 km\\\\\\\\/h. Humidity will be around 22%.\",\"Evening\":\"Evening will be partly cloudy with a temperature range of 7\\\\\\\\u00b0C to 10\\\\\\\\u00b0C. Expect a gentle wind blowing from the southwest to northeast, with gusts reaching up to 9 km\\\\\\\\/h. Humidity will be around 29%.\",\"time\":\"20210331000000\",\"note\":\"\"}\\'), (\\'20210401000000\\', \\'{\"daily\":\"It\\\\\\'s going to be a chilly April day with a mix of passing clouds and broken clouds. Expect a temperature trend of warming up in the morning and cooling down in the evening. There might be a sudden shower in the late afternoon. Overall, it\\\\\\'s a great day to enjoy the outdoors with a light jacket.\",\"Early Morning\":\"Early morning will be quite chilly with a temperature around 2-3\\\\\\\\u00b0C. Expect passing clouds with a gentle breeze. It\\\\\\'s a great time to get some fresh air and enjoy the morning.\",\"Morning\":\"Morning will see a slight warming up with temperatures reaching around 10-12\\\\\\\\u00b0C. The sky will be partly sunny with a gentle breeze. It\\\\\\'s a perfect time to get out and about.\",\"Afternoon\":\"Afternoon will be quite windy with gusts reaching up to 50 km\\\\\\\\/h. Temperatures will be around 14-16\\\\\\\\u00b0C. Expect passing clouds with a chance of sudden showers. It\\\\\\'s a good idea to carry an umbrella.\",\"Evening\":\"Evening will see a cooling down with temperatures dropping to around 8-10\\\\\\\\u00b0C. Expect passing clouds with a gentle breeze. It\\\\\\'s a great time to relax and unwind.\",\"time\":\"20210401000000\",\"note\":\"\"}\\')]\\n\\nWe now have the weather forecasting for the following days:\\n\\n[(\\'20210401000000\\', \\'{\"daily\":\"It\\\\\\'s going to be a chilly April day with a mix of passing clouds and broken clouds. Expect a temperature trend of warming up in the morning and cooling down in the evening. There might be a sudden shower in the late afternoon. Overall, it\\\\\\'s a great day to enjoy the outdoors with a light jacket.\",\"Early Morning\":\"Early morning will be quite chilly with a temperature around 2-3\\\\\\\\u00b0C. Expect passing clouds with a gentle breeze. It\\\\\\'s a great time to get some fresh air and enjoy the morning.\",\"Morning\":\"Morning will see a slight warming up with temperatures reaching around 10-12\\\\\\\\u00b0C. The sky will be partly sunny with a gentle breeze. It\\\\\\'s a perfect time to get out and about.\",\"Afternoon\":\"Afternoon will be quite windy with gusts reaching up to 50 km\\\\\\\\/h. Temperatures will be around 14-16\\\\\\\\u00b0C. Expect passing clouds with a chance of sudden showers. It\\\\\\'s a good idea to carry an umbrella.\",\"Evening\":\"Evening will see a cooling down with temperatures dropping to around 8-10\\\\\\\\u00b0C. Expect passing clouds with a gentle breeze. It\\\\\\'s a great time to relax and unwind.\",\"time\":\"20210401000000\",\"note\":\"\"}\\'), (\\'20210402000000\\', \\'{\"daily\":\"It\\\\\\'s going to be a chilly April day with a mix of passing clouds and clear skies. Temperatures will be quite low, ranging from -2 to 12 degrees Celsius. Expect a gentle breeze with wind speeds around 9-32 km\\\\\\\\/h. As the day progresses, the temperature will rise, and the wind will pick up. Be prepared for a partly sunny afternoon with scattered clouds. Overnight, the temperature will drop, and the skies will clear up.\",\"Early Morning\":\"Early morning will be quite chilly with temperatures around 0-3\\\\\\\\u00b0C. Expect passing clouds with a gentle breeze of 9 km\\\\\\\\/h. It\\\\\\'s a good idea to bundle up!\",\"Morning\":\"Morning will see a slight rise in temperature to around 5-6\\\\\\\\u00b0C. The skies will be partly cloudy with a moderate breeze of 13 km\\\\\\\\/h. It\\\\\\'s a great time to get some fresh air!\",\"Afternoon\":\"Afternoon will be partly sunny with scattered clouds and a temperature range of 8-12\\\\\\\\u00b0C. Expect a moderate breeze of 20 km\\\\\\\\/h. It\\\\\\'s a perfect time for outdoor activities!\",\"Evening\":\"Evening will see a slight drop in temperature to around 1-4\\\\\\\\u00b0C. The skies will clear up with a gentle breeze of 6 km\\\\\\\\/h. It\\\\\\'s a great time to relax and enjoy the evening!\",\"time\":\"20210402000000\",\"note\":\"\"}\\')]\\n\\nPlease make the prediction for the next 24 hours.\\n\\nThe timestamp for forecasting is as follows:\\n\\n[20210401080000, 20210401090000, 20210401100000, 20210401110000, 20210401120000, 20210401130000, 20210401140000, 20210401150000, 20210401160000, 20210401170000, 20210401180000, 20210401190000, 20210401200000, 20210401210000, 20210401220000, 20210401230000, 20210402000000, 20210402010000, 20210402020000, 20210402030000, 20210402040000, 20210402050000, 20210402060000, 20210402070000]\\n\\nPlease format it in json format in [datastamp, value] pair, as below:\\n\\n```json\\n\\n[[<timestamp>, <predicted_value>],\\n [<timestamp>, <predicted_value>],\\n ...]\\n\\n```\\n'"
      ]
     },
     "execution_count": 98,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "user_prompt"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "uni2ts",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
